Dependency Injection (DI) একটি সফটওয়্যার ডিজাইন প্যাটার্ন যা ক্লাস বা ফাংশনগুলোর মধ্যে নির্ভরতাগুলো বাইরের উৎস থেকে ইনজেক্ট (প্রদান) করে। JasmineJS এ Dependency Injection ব্যবহার করে আপনি সহজেই মক (mock) বা স্পাই (spy) অবজেক্ট ইনজেক্ট করতে পারেন, যা আপনার টেস্টগুলিকে আরও বেশি ইউনিট টেস্টযোগ্য ও স্বাধীন করে তোলে।
DI এর মাধ্যমে আপনি টেস্টের জন্য নির্দিষ্ট উপাদানগুলো ইনজেক্ট করতে পারেন, যার ফলে নির্দিষ্ট ফাংশন বা ক্লাসের বাইরে থাকা ডিপেন্ডেন্সি গুলোর ওপর নিয়ন্ত্রণ সহজ হয়। এভাবে আপনি টেস্টের ভিতরে নির্ভরশীল অবজেক্টগুলোর আচরণ নিয়ন্ত্রণ করতে পারেন।
Dependency Injection এর মৌলিক ধারণা
Dependency Injection একটি ক্লাস বা ফাংশনের বাইরে থেকে তার নির্ভরশীল অবজেক্টগুলিকে সরবরাহ করা। এর মাধ্যমে কোডে যেসব নির্ভরতাগুলি থাকে (যেমন API কল, ডাটাবেস অ্যাক্সেস, থার্ড-পার্টি লাইব্রেরি ইত্যাদি), সেগুলিকে সহজেই টেস্টিং এর জন্য মক বা স্পাই অবজেক্টের মাধ্যমে প্রতিস্থাপন করা যায়।
JasmineJS এ Dependency Injection
JasmineJS এ DI প্রাকটিস প্রয়োগ করার জন্য, আমরা মূল ফাংশন বা ক্লাসের ডিপেন্ডেন্সিগুলিকে মক বা স্পাই অবজেক্ট দিয়ে রিপ্লেস (replace) করতে পারি। এতে করে আমরা মূল ফাংশনের আচরণ পরীক্ষা করতে পারি, এবং বাহ্যিক নির্ভরশীলতা (যেমন ডাটাবেস বা API কল) শূন্য বা মক করা যেতে পারে।
উদাহরণ: JasmineJS এ Dependency Injection
ধরা যাক, আমাদের একটি UserService ক্লাস আছে যা ডাটাবেসে ডেটা সেভ করতে একটি Database ক্লাসের ওপর নির্ভরশীল। এখানে, Database ক্লাসটিকে আমরা একটি মক (mock) অবজেক্ট দিয়ে রিপ্লেস করব এবং শুধু UserService এর কার্যকারিতা টেস্ট করব।
Code Example:
// মূল কোড (UserService.js)
class Database {
save(user) {
// এই মেথডটি ডাটাবেসে ইউজারের ডেটা সেভ করবে
console.log("User saved to database:", user);
}
}
class UserService {
constructor(db) {
this.db = db; // এখানে ডিপেন্ডেন্সি ইনজেক্ট করা হচ্ছে
}
createUser(name) {
const user = { name };
this.db.save(user); // ডিপেন্ডেন্সি ব্যবহার হচ্ছে
}
}
এখানে UserService ক্লাসটি Database ক্লাসের ওপর নির্ভরশীল, এবং Database মেথড save() কল করার জন্য নির্ভর করে।
JasmineJS টেস্টে Dependency Injection প্রয়োগ
এখন, আমরা JasmineJS ব্যবহার করে এই কোডের জন্য টেস্ট লিখব, যেখানে Database ক্লাসটিকে মক বা স্পাই অবজেক্ট দিয়ে রিপ্লেস করা হবে।
টেস্টের উদাহরণ:
describe("UserService", function() {
let userService;
let mockDatabase;
beforeEach(function() {
// Dependency Injection এর মাধ্যমে mockDatabase ইনজেক্ট করা হচ্ছে
mockDatabase = {
save: jasmine.createSpy("save") // মক মেথড তৈরি
};
userService = new UserService(mockDatabase); // UserService তৈরি হচ্ছে মক ডাটাবেসের সাথে
});
it("should call save on the database when creating a user", function() {
const userName = "John";
userService.createUser(userName);
// টেস্ট নিশ্চিত করবে যে save() মেথডটি কল হয়েছে
expect(mockDatabase.save).toHaveBeenCalledWith({ name: userName });
});
});
এখানে:
mockDatabase:Databaseক্লাসের মক অবজেক্ট তৈরি করা হয়েছে। এখানেsave()মেথডটি একটি স্পাই মেথড হিসেবে তৈরি করা হয়েছে, যা পরীক্ষায় এটি কতবার এবং কিভাবে কল হয়েছে তা ট্র্যাক করবে।userService:UserServiceক্লাসটিmockDatabaseইনজেক্ট করা হয়েছে, যার ফলে আসল ডাটাবেস কলটি না হয়ে মক অবজেক্টেরsave()মেথডটি কল হবে।toHaveBeenCalledWith(): এই Matcher টি যাচাই করবে যেsave()মেথডটি সঠিক আর্গুমেন্ট সহ কল হয়েছে কি না।
JasmineJS এ Dependency Injection এর সুবিধা
- ইউনিট টেস্টিং সহজ করা: ডিপেন্ডেন্সি ইনজেকশন ব্যবহার করে আপনি বাহ্যিক নির্ভরতাগুলিকে মক বা স্পাই দিয়ে রিপ্লেস করতে পারেন, যার ফলে আপনার টেস্ট কেসগুলো খুবই স্বাধীন এবং দ্রুত চলে।
- বাহ্যিক অবজেক্টগুলোর ওপর নিয়ন্ত্রণ: মক অবজেক্ট বা স্পাই ইনজেক্ট করে আপনি বাহ্যিক অবজেক্টের আচরণ নিয়ন্ত্রণ করতে পারেন, যেমন API কল বা ডাটাবেস অ্যাক্সেস।
- আলাদা ফাংশনের টেস্ট: ডিপেন্ডেন্সি ইনজেকশনের মাধ্যমে আপনি একে অপরের থেকে স্বাধীনভাবে প্রতিটি ফাংশন বা ক্লাস টেস্ট করতে পারবেন।
- রিলায়েবল টেস্টিং: বাহ্যিক সিস্টেমের ওপর নির্ভরশীলতা কমানোর মাধ্যমে, আপনি নির্ভরযোগ্য টেস্ট ফলাফল পাবেন।
সারাংশ
- Dependency Injection: JasmineJS এ Dependency Injection এর মাধ্যমে আপনি মক বা স্পাই অবজেক্ট ব্যবহার করে বাহ্যিক নির্ভরতাগুলোকে ইনজেক্ট করতে পারেন। এর মাধ্যমে আপনার টেস্ট কেসগুলোকে আরও স্বাধীন এবং ইউনিট টেস্টযোগ্য করা সম্ভব হয়।
- Mocking এবং Spying: Dependency Injection ব্যবহার করে আপনি বাহ্যিক ফাংশন বা ক্লাসের আচরণ মক (mock) বা স্পাই (spy) করতে পারেন, যা আপনার টেস্ট কেসগুলির ওপর নিয়ন্ত্রণ নিয়ে আসে।
- প্রধান সুবিধা: এর মাধ্যমে আপনি কোডের নির্ভরশীলতাগুলোকে ম্যানেজ করতে পারেন এবং আপনার টেস্টগুলোকে আরও নির্ভরযোগ্য ও কার্যকরী করতে পারেন।
Read more